﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	Элементы.ГруппаВидПолномочий.ТолькоПросмотр = Параметры.ТолькоПросмотр;
	Элементы.ВыбратьИзКлассификатора.Видимость = Не Параметры.ТолькоПросмотр;
	Элементы.ОбновитьКлассификаторыПолномочий.Видимость = Не ОбщегоНазначения.РазделениеВключено();
	
	РежимКлассификатора = Параметры.РежимКлассификатора;
	
	Если Параметры.ВыбранныеПолномочия = Неопределено Тогда
		ВидПолномочий = "0";
	Иначе
		
		Если Параметры.ВыбранныеПолномочия.ПолномочияВТекстовомВиде Тогда
			ТекстПолномочий = Параметры.ВыбранныеПолномочия.ТекстПолномочий;
			Если Параметры.ВыбранныеПолномочия.ТекстПолномочий = 
				МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ПредставлениеНеограниченныхПолномочий() Тогда
				ВидПолномочий = "2";
			Иначе
				ВидПолномочий = "1";
			КонецЕсли;
		Иначе
			ВидПолномочий = "0";
		КонецЕсли;
		
		СформироватьДеревоПолномочий(Параметры.ВыбранныеПолномочия.Полномочия);
		Элементы.ПоказатьВыбранные.Пометка = Элементы.ПоказатьВыбранные.Пометка
			И  Не РежимКлассификатора;
		Элементы.ПоказатьВыбранные.Видимость = Не Параметры.РежимКлассификатора;
		Элементы.ГруппаКнопокВидПолномочий.Видимость = Не Параметры.РежимКлассификатора;
		Элементы.ГруппаСохранение.Видимость = Не Параметры.РежимКлассификатора;
		Элементы.ГруппаОграниченияПолномочий.Видимость = Не Параметры.РежимКлассификатора;
	КонецЕсли;
	
	УправлениеФормой(ЭтотОбъект);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормы

&НаКлиенте
Процедура ПолномочияПриАктивизацииСтроки(Элемент)
	
	Если Элементы.Полномочия.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Элементы.Полномочия.ТекущиеДанные.ПолучитьЭлементы().Количество() > 0 Тогда
		Элементы.ОграниченияПолномочий.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	Элементы.ОграниченияПолномочий.Видимость = Элементы.Полномочия.ТекущиеДанные.Пометка;
	ОграниченияПолномочийОтборСтрок(Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолномочияПометкаПриИзменении(Элемент) 
	
	Элементы.Полномочия.ТекущиеДанные.Пометка = Не Элементы.Полномочия.ТекущиеДанные.Флажок;
	Элементы.Полномочия.ТекущиеДанные.Флажок = Не Элементы.Полномочия.ТекущиеДанные.Флажок;
	
	Строки = Элементы.Полномочия.ТекущиеДанные.ПолучитьЭлементы();
	Если Строки.Количество() > 0 Тогда
		СнятьУстановитьФлажки(Строки, Элементы.Полномочия.ТекущиеДанные.Флажок);
		Возврат;
	Иначе
		ОбновитьПометкуРодителя(Элементы.Полномочия.ТекущиеДанные.ПолучитьРодителя());
	КонецЕсли;
	
	ОбновитьСтрокуВыбранныхПолномочий(Элементы.Полномочия.ТекущиеДанные.Флажок, Элементы.Полномочия.ТекущиеДанные);
	
	Если Не Элементы.Полномочия.ТекущиеДанные.Пометка Тогда
		Элементы.ОграниченияПолномочий.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия) Тогда
		Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия = Новый УникальныйИдентификатор;
		ОграниченияПолномочийОтборСтрок(Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия);
	КонецЕсли;
	
	Элементы.ОграниченияПолномочий.Видимость = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ОграниченияПолномочийПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	
	Если Элементы.ПоказатьВыбранные.Пометка Тогда
		Если Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные = Неопределено Тогда
			Возврат;
		КонецЕсли;
		ИдентификаторПолномочия = Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные.ИдентификаторПолномочия;
		Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные.ЕстьОграничения = Истина;
	Иначе
		Если Элементы.Полномочия.ТекущиеДанные = Неопределено Тогда
			Возврат;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия) Тогда
			Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия = Новый УникальныйИдентификатор;
		КонецЕсли;
		ИдентификаторПолномочия = Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия;
	КонецЕсли;

	ОграниченияПолномочийОтборСтрок(ИдентификаторПолномочия);
	
	НоваяСтрока = ОграниченияПолномочий.Добавить();
	НоваяСтрока.ИдентификаторПолномочия = ИдентификаторПолномочия;
	
КонецПроцедуры

&НаКлиенте
Процедура ПолномочияПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ВыбраннаяСтрока = Элементы.Полномочия.ТекущиеДанные;
	Если Не ВыбраннаяСтрока.Пометка Тогда
		Возврат;
	КонецЕсли;
	
	Если ВыбраннаяСтрока.ПолучитьЭлементы().Количество() > 0 Тогда
		Возврат;
	КонецЕсли;
	
	ОбновитьСтрокуВыбранныхПолномочий(ВыбраннаяСтрока.Пометка, ВыбраннаяСтрока)
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПолномочияТаблицаПриАктивизацииСтроки(Элемент)
	
	Если Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные = Неопределено Тогда
		Возврат
	КонецЕсли;
	ОграниченияПолномочийОтборСтрок(Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные.ИдентификаторПолномочия);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПолномочияТаблицаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	
	НоваяСтрока = ВыбранныеПолномочияТаблица.Добавить();
	НоваяСтрока.ИдентификаторПолномочия = Новый УникальныйИдентификатор;

КонецПроцедуры

&НаКлиенте
Процедура ОграниченияПолномочийПриАктивизацииЯчейки(Элемент)
	
	Если Элементы.ОграниченияПолномочий.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Элемент.ТекущийЭлемент.Имя = "ОграниченияПолномочияНаименованиеЗначения" Тогда
		Элемент.ТекущийЭлемент.ПодсказкаВВода = Элементы.ОграниченияПолномочий.ТекущиеДанные.Описание;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПолномочияТаблицаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Если Копирование Тогда
		Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные.ИдентификаторПолномочия = Новый УникальныйИдентификатор;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОграниченияПолномочияКодНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ОткрытьФорму("Справочник.МашиночитаемыеДоверенности.Форма.ВыборОграниченийПолномочий",,ЭтотОбъект,,,,
		Новый ОписаниеОповещения("ПослеВыбораОграничений", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ПоказатьВыбранные(Команда)
	
	Элементы.ПоказатьВыбранные.Пометка = Не Элементы.ПоказатьВыбранные.Пометка;
	ВидимостьПоказатьВыбранные(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьИзКлассификатора(Команда)
	
	Элементы.ПоказатьВыбранные.Пометка = Не Элементы.ПоказатьВыбранные.Пометка;
	ВидимостьПоказатьВыбранные(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФлажки(Команда)
	
	СнятьУстановитьФлажки(Полномочия.ПолучитьЭлементы(), Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СнятьФлажки(Команда)
	
	СнятьУстановитьФлажки(Полномочия.ПолучитьЭлементы(), Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура Сохранить(Команда)
	
	ВыбранныеПолномочия = Новый Массив;
	ВыбранныеОграничения = Новый Массив;
	
	Если Не СохранениеВозможно(ВыбранныеПолномочия, ВыбранныеОграничения) Тогда
		Возврат;
	КонецЕсли;
	
	Результат = Новый Структура;
	Если ВидПолномочий = "2" Или ВидПолномочий = "1" 
		И ТекстПолномочий = МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ПредставлениеНеограниченныхПолномочий() Тогда
		Результат.Вставить("ТекстПолномочий", 
			МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ПредставлениеНеограниченныхПолномочий());
		Результат.Вставить("ПолномочияВТекстовомВиде", Истина);
		Результат.Вставить("Полномочия", Неопределено);
	ИначеЕсли ВидПолномочий = "1" Тогда
		Результат.Вставить("ТекстПолномочий", ТекстПолномочий);
		Результат.Вставить("ПолномочияВТекстовомВиде", Истина);
		Результат.Вставить("Полномочия", Неопределено);
	Иначе
		Результат.Вставить("ТекстПолномочий", "");
		Результат.Вставить("ПолномочияВТекстовомВиде", Ложь);
		Результат.Вставить("Полномочия", ВыбранныеПолномочия);
		Результат.Вставить("ОграниченияПолномочий", ВыбранныеОграничения);
	КонецЕсли;
	
	Закрыть(Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолномочияИзКлассификатора(Команда)
	ВидПолномочий = "0";
	УправлениеФормой(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ПолномочияВТекстовомВиде(Команда)
	ВидПолномочий = "1";
	УправлениеФормой(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ПолномочияНеОграничены(Команда)
	ВидПолномочий = "2";
	ТекстПолномочий = МашиночитаемыеДоверенностиФНССлужебныйКлиентСервер.ПредставлениеНеограниченныхПолномочий();
	УправлениеФормой(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Асинх Процедура СохранитьНастройкуПолномочий(Команда)
	
	Наименование = Ждать ВвестиСтрокуАсинх("", НСтр("ru='Введите имя настройки'"), 150);
	
	Если Наименование = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВыбранныеПолномочия = Новый Массив;
	ВыбранныеОграничения = Новый Массив;
	
	Если Не СохранениеВозможно(ВыбранныеПолномочия, ВыбранныеОграничения) Тогда
		Возврат;
	КонецЕсли;
	
	НастройкаПолномочий = Новый Структура("Полномочия, Ограничения", ВыбранныеПолномочия, ВыбранныеОграничения);
	СохранитьНастройку(НастройкаПолномочий, Наименование);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьНастройкуПолномочий(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьНастройкуПолномочийПослеВыбора", ЭтотОбъект);
	ОткрытьФорму("Справочник.МашиночитаемыеДоверенности.Форма.НастройкиПолномочий",,ЭтотОбъект,,,,
		ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьКлассификаторыПолномочий(Команда)
	
	ОбновитьКлассификаторыПолномочийНаСервере();
	ОбновитьСписокПолномочий();
	ПоказатьПредупреждение(, НСтр("ru = 'Обновление классификаторов полномочий выполнено.'"));
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеФормой(Форма)
	
	Если Форма.ВидПолномочий = "1" Тогда
		ЗаголовокВидаПолномочий = НСтр("ru='Полномочия в текстовом виде'");
	ИначеЕсли Форма.ВидПолномочий = "2" Тогда
		ЗаголовокВидаПолномочий = НСтр("ru='Полномочия не ограничены'");
	Иначе
		ЗаголовокВидаПолномочий = НСтр("ru='Полномочия в машиночитаемом виде'");
	КонецЕсли;
	
	Если Форма.ВидПолномочий = "1" Или Форма.ВидПолномочий = "2" Тогда
		Форма.Элементы.ГруппаКнопокВидПолномочий2.Заголовок = ЗаголовокВидаПолномочий;
		Форма.Элементы.ГруппаТаблицаПолномочий.Видимость = Ложь;
		Форма.Элементы.ГруппаТекстПолномочий.Видимость = Истина;
		Форма.Элементы.ГруппаТекстПолномочий.ТолькоПросмотр = Форма.ВидПолномочий = "2";
	Иначе
		Форма.Элементы.ГруппаКнопокВидПолномочий.Заголовок  = ЗаголовокВидаПолномочий;
		Форма.Элементы.ГруппаКнопокВидПолномочий1.Заголовок = ЗаголовокВидаПолномочий;
		Форма.Элементы.ГруппаТаблицаПолномочий.Видимость = Истина;
		Форма.Элементы.ГруппаТекстПолномочий.Видимость = Ложь;
		ВидимостьПоказатьВыбранные(Форма);
	КонецЕсли;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ВидимостьПоказатьВыбранные(Форма)
	
	Форма.Элементы.ВыбранныеПолномочияТаблица.Видимость = Форма.Элементы.ПоказатьВыбранные.Пометка;
	Форма.Элементы.Полномочия.Видимость = Не Форма.Элементы.ПоказатьВыбранные.Пометка;
	Если Форма.Элементы.ПоказатьВыбранные.Пометка Тогда
		Форма.Элементы.ОграниченияПолномочий.Видимость = Истина;
	КонецЕсли;
	Форма.Элементы.КоманднаяПанельВыбранные.Видимость = Форма.Элементы.ПоказатьВыбранные.Пометка;
	Форма.Элементы.КнопкиВыбораИзКлассификатора.Видимость = Не Форма.Элементы.ПоказатьВыбранные.Пометка;

КонецПроцедуры

&НаКлиенте
Функция СохранениеВозможно(ВыбранныеПолномочия, ВыбранныеОграничения)
	
	Отказ = Ложь;
	
	ОчиститьСообщения();
	
	// проверяем полномочия
	Если ВидПолномочий = "0" Тогда
		
		Для Каждого Строка Из ВыбранныеПолномочияТаблица Цикл
			
			Структура = Новый Структура;
			Структура.Вставить("ИдентификаторПолномочия", Строка.ИдентификаторПолномочия);
			Структура.Вставить("Код", Строка.Код);
			Структура.Вставить("Наименование", Строка.Наименование);
			Структура.Вставить("Мнемокод", Строка.Мнемокод);
			
			Если Не ЗначениеЗаполнено(Строка.Код) Тогда
				ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Не заполнен код полномочия.'"), ,
					"ВыбранныеПолномочияТаблица[" + ВыбранныеПолномочияТаблица.Индекс(Строка) + "].Код", , Отказ);
			КонецЕсли;
			
			Если Не ЗначениеЗаполнено(Строка.Наименование) Тогда
				ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Не заполнено наименование полномочия.'"), ,
					"ВыбранныеПолномочияТаблица[" + ВыбранныеПолномочияТаблица.Индекс(Строка) + "].Наименование", , Отказ);
			КонецЕсли;
			
			ВыбранныеПолномочия.Добавить(Структура);
			Найдено = ОграниченияПолномочий.НайтиСтроки(Новый Структура("ИдентификаторПолномочия", Строка.ИдентификаторПолномочия));
			Для Каждого Ограничение Из Найдено Цикл
				
				Структура = Новый Структура;
				Структура.Вставить("ИдентификаторПолномочия", Ограничение.ИдентификаторПолномочия); 
				Структура.Вставить("Код", Ограничение.Код);
				Структура.Вставить("Наименование", Ограничение.Наименование);
				Структура.Вставить("КодЗначения", Ограничение.КодЗначения);
				
				Если Не ЗначениеЗаполнено(Ограничение.Код) Тогда
					ОбщегоНазначенияКлиент.СообщитьПользователю(
						СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Не заполнен код ограничения у полномочия %1 %2.'"), Строка.Код, Строка.Наименование), ,
						"ОграниченияПолномочий[" + ОграниченияПолномочий.Индекс(Ограничение) + "].Код", , Отказ);
				КонецЕсли;
				
				Если Не ЗначениеЗаполнено(Ограничение.НаименованиеЗначения) Тогда
					ОбщегоНазначенияКлиент.СообщитьПользователю(
						СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Не заполнено значение ограничения у полномочия %1 %2.'"), Строка.Код, Строка.Наименование), ,
							"ОграниченияПолномочий[" + ОграниченияПолномочий.Индекс(Ограничение) + "].НаименованиеЗначения", , Отказ);
				КонецЕсли;
				
				Если ЗначениеЗаполнено(Ограничение.КодЗначения) Тогда
					Структура.Вставить("НаименованиеЗначения", Ограничение.НаименованиеЗначения);
					Структура.Вставить("ТекстовоеЗначение", "");
				Иначе
					Структура.Вставить("НаименованиеЗначения", "");
					Структура.Вставить("ТекстовоеЗначение", Ограничение.НаименованиеЗначения);
				КонецЕсли;
				
				ВыбранныеОграничения.Добавить(Структура);
				
			КонецЦикла;
			
			Если Отказ Тогда
				Элементы.ПоказатьВыбранные.Пометка = Истина;
				ВидимостьПоказатьВыбранные(ЭтотОбъект);
			КонецЕсли;
			
		КонецЦикла;

		Если Не РежимКлассификатора И ВыбранныеПолномочия.Количество() = 0 Тогда
			Элементы.ПоказатьВыбранные.Пометка = Ложь;
			ВидимостьПоказатьВыбранные(ЭтотОбъект);
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				НСтр("ru = 'Не выбрано ни одно полномочие.'"), , "Полномочия", , Отказ);
		КонецЕсли;
	Иначе
		Если ПустаяСтрока(ТекстПолномочий) Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				НСтр("ru = 'Не заполнен текст полномочий.'"), , "ТекстПолномочий", , Отказ);
		ИначеЕсли СтрДлина(ТекстПолномочий) > 10000 Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				НСтр("ru = 'Текст полномочий превышает 10000 символов.'"), , "ТекстПолномочий", , Отказ);
		КонецЕсли;
	КонецЕсли;

	Возврат Не Отказ;
	
КонецФункции

&НаСервере
Процедура СформироватьДеревоПолномочий(АдресПолномочий)
	
	КлассификаторПолномочий = МашиночитаемыеДоверенностиФНСПовтИсп.КлассификаторПолномочий();

	ДеревоЗначений = ОбщегоНазначения.СкопироватьРекурсивно(КлассификаторПолномочий);
	ДеревоЗначений.Колонки.Добавить("Мнемокод", ОбщегоНазначения.ОписаниеТипаСтрока(255));
	ДеревоЗначений.Колонки.Добавить("НетВКлассификаторе", Новый ОписаниеТипов("Булево"));
	ДеревоЗначений.Колонки.Добавить("Пометка", ОбщегоНазначения.ОписаниеТипаЧисло(1));
	ДеревоЗначений.Колонки.Добавить("Флажок", Новый ОписаниеТипов("Булево"));
	ДеревоЗначений.Колонки.Добавить("ИдентификаторПолномочия", Новый ОписаниеТипов("УникальныйИдентификатор"));
	
	Если АдресПолномочий <> Неопределено Тогда
		
		ВыбранныеПолномочия = ПолучитьИзВременногоХранилища(АдресПолномочий);
		Если ТипЗнч(ВыбранныеПолномочия) = Тип("Массив") Тогда
			ЗагрузитьВыбранныеПолномочияПоКоду(ВыбранныеПолномочия, ДеревоЗначений);
		Иначе
			ЗагрузитьВыбранныеПолномочия(ВыбранныеПолномочия, ДеревоЗначений);
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.ПоказатьВыбранные.Пометка = ВыбранныеПолномочияТаблица.Количество() > 0;
	ЗначениеВРеквизитФормы(ДеревоЗначений, "Полномочия");
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьВыбранныеПолномочияПоКоду(ВыбранныеПолномочия, ДеревоЗначений)
	Для Каждого Полномочие Из ВыбранныеПолномочия Цикл
		
		Найдено = ДеревоЗначений.Строки.Найти(Полномочие, "Код", Истина);
		
		Если Найдено <> Неопределено Тогда
			Найдено.Пометка = Истина;
			Найдено.Родитель.Пометка = 2;
			СтрокаВыбранные = ВыбранныеПолномочияТаблица.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаВыбранные, Найдено);
			СтрокаВыбранные.НетВКлассификаторе = Ложь;
			СтрокаВыбранные.ИдентификаторПолномочия = Новый УникальныйИдентификатор;
			Найдено.ИдентификаторПолномочия = СтрокаВыбранные.ИдентификаторПолномочия;
		КонецЕсли;
				
	КонецЦикла;
	
	ГруппыСПометками = ДеревоЗначений.Строки.НайтиСтроки(Новый Структура("Пометка", 2), Ложь);
	
	Для Каждого ГруппаСПометкой Из ГруппыСПометками Цикл
		Если ГруппаСПометкой.Строки.Найти(0, "Пометка", Ложь) = Неопределено Тогда
			ГруппаСПометкой.Пометка = 1;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьВыбранныеПолномочия(ВыбранныеПолномочия, ДеревоЗначений)
	
	СтрокиСПометками = Новый Соответствие;
	Для Каждого Полномочие Из ВыбранныеПолномочия.Полномочия Цикл
		
		Найдено = ДеревоЗначений.Строки.НайтиСтроки(
			Новый Структура("Код, Наименование", Полномочие.Код, Полномочие.Наименование), Истина);
		
		Если Найдено.Количество() = 0 Тогда
			НетВКлассификаторе = Истина;
		Иначе
			НетВКлассификаторе = Ложь;
			НоваяСтрока = Найдено[0];
			НоваяСтрока.Пометка = Истина;
			НоваяСтрока.ИдентификаторПолномочия = Полномочие.ИдентификаторПолномочия;
			Если ЗначениеЗаполнено(НоваяСтрока.Родитель) Тогда
				Если СтрокиСПометками[НоваяСтрока.Родитель] = Неопределено Тогда
					СтрокиСПометками.Вставить(НоваяСтрока.Родитель, Истина);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		СтрокаВыбранные = ВыбранныеПолномочияТаблица.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаВыбранные, Полномочие);
		СтрокаВыбранные.НетВКлассификаторе = НетВКлассификаторе;
		
	КонецЦикла;
	
	Для Каждого КлючИЗначение Из СтрокиСПометками Цикл
		Родитель = КлючИЗначение.Ключ;
		РазныеСтроки = Ложь;
		Флажок = Неопределено;
		Для Каждого Строка Из Родитель.Строки Цикл
			Если Флажок = Неопределено Тогда
				Флажок = Строка.Пометка;
				Продолжить;
			КонецЕсли;
			Если Флажок <> Строка.Пометка Тогда
				РазныеСтроки = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Если РазныеСтроки Тогда
			Родитель.Пометка = 2;
		Иначе
			Родитель.Пометка = Флажок;
		КонецЕсли;
	КонецЦикла;
	
	ИдентификаторыПолномочийСОграничениями = Новый Соответствие;
	
	Если ВыбранныеПолномочия.Ограничения.Количество() > 0 Тогда
		КлассификаторОграничений = МашиночитаемыеДоверенностиФНСПовтИсп.КлассификаторОграничений();
		ЗначенияОграничений = МашиночитаемыеДоверенностиФНСПовтИсп.ЗначенияОграничений();
	КонецЕсли;
	
	Для Каждого Ограничение Из ВыбранныеПолномочия.Ограничения Цикл
		
		НоваяСтрока = ОграниченияПолномочий.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Ограничение);
		
		Найдено = КлассификаторОграничений.НайтиСтроки(
			Новый Структура("Код, Наименование", НоваяСтрока.Код, НоваяСтрока.Наименование));
		Если Найдено.Количество() > 0 Тогда
			НоваяСтрока.ЭтоТекстовоеЗначение = Найдено[0].ЭтоТекстовоеЗначение;
		Иначе
			НоваяСтрока.НетВКлассификаторе = Истина;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(НоваяСтрока.КодЗначения) Тогда
			НоваяСтрока.НаименованиеЗначения = Ограничение.ТекстовоеЗначение;
		Иначе
			
			Найдено = ЗначенияОграничений.НайтиСтроки(
			Новый Структура("Код", НоваяСтрока.КодЗначения));
			Если Найдено.Количество() = 0 Тогда
				НоваяСтрока.НетВКлассификатореКодаЗначения = Истина;
			КонецЕсли;
			
		КонецЕсли;
		
		ИдентификаторыПолномочийСОграничениями.Вставить(Ограничение.ИдентификаторПолномочия, Истина);
	КонецЦикла;
	
	Для Каждого КлючИЗначение Из ИдентификаторыПолномочийСОграничениями Цикл
		Найдено = ВыбранныеПолномочияТаблица.НайтиСтроки(
		Новый Структура("ИдентификаторПолномочия", КлючИЗначение.Ключ));
		Если Найдено.Количество() > 0 Тогда
			Найдено[0].ЕстьОграничения = Истина;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ПолномочияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	НоваяСтрока = Полномочия.ПолучитьЭлементы().Добавить();
	НоваяСтрока.НетВКлассификаторе = Истина;
	НоваяСтрока.Пометка = Истина;
	
КонецПроцедуры 

&НаКлиенте
Процедура СнятьУстановитьФлажки(Строки, Флажок)
	Для Каждого Строка Из Строки Цикл
		Строка.Пометка = Флажок;
		СтрокиДочерние = Строка.ПолучитьЭлементы();
		Если СтрокиДочерние.Количество() = 0 Тогда
			ОбновитьСтрокуВыбранныхПолномочий(Флажок, Строка);
		Иначе
			СнятьУстановитьФлажки(СтрокиДочерние, Флажок);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПометкуРодителя(Родитель)
	
	Если Родитель <> Неопределено Тогда
		РазныеСтроки = Ложь;
		Строки = Родитель.ПолучитьЭлементы();
		Флажок = Неопределено;
		
		Для Каждого Строка Из Строки Цикл
			Если Флажок = Неопределено Тогда
				Флажок = Строка.Пометка;
				Продолжить;
			КонецЕсли;
			Если Флажок <> Строка.Пометка Тогда
				РазныеСтроки = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если РазныеСтроки Тогда
			Родитель.Пометка = 2;
		Иначе
			Родитель.Пометка = Флажок;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОграниченияПолномочийОтборСтрок(ИдентификаторПолномочия)
	
	СтруктураПоиска = Новый Структура;
	СтруктураПоиска.Вставить("ИдентификаторПолномочия", ИдентификаторПолномочия);
	Элементы.ОграниченияПолномочий.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураПоиска);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСтрокуВыбранныхПолномочий(Флажок, Строка)
	
	Если Не ЗначениеЗаполнено(Строка.ИдентификаторПолномочия) Тогда
		Строка.ИдентификаторПолномочия = Новый УникальныйИдентификатор;
	КонецЕсли;
	
	Найдено = ВыбранныеПолномочияТаблица.НайтиСтроки(
		Новый Структура("ИдентификаторПолномочия", Строка.ИдентификаторПолномочия));
	
	Если Флажок = 1 Тогда
		Если Найдено.Количество() = 0 Тогда
			НоваяСтрока = ВыбранныеПолномочияТаблица.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		КонецЕсли;
	ИначеЕсли Найдено.Количество() > 0 Тогда
		Для Каждого НайденнаяСтрока Из Найдено Цикл
			ВыбранныеПолномочияТаблица.Удалить(ВыбранныеПолномочияТаблица.Индекс(НайденнаяСтрока));
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОграниченияПолномочийПослеУдаления(Элемент)
	
	Если Элементы.ПоказатьВыбранные.Пометка Тогда
		Если Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные = Неопределено Тогда
			Возврат;
		КонецЕсли;
		ИдентификаторПолномочия = Элементы.ВыбранныеПолномочияТаблица.ТекущиеДанные.ИдентификаторПолномочия;
	Иначе
		Если Элементы.Полномочия.ТекущиеДанные = Неопределено Тогда
			Возврат;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия) Тогда
			Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия = Новый УникальныйИдентификатор;
		КонецЕсли;
		ИдентификаторПолномочия = Элементы.Полномочия.ТекущиеДанные.ИдентификаторПолномочия;
	КонецЕсли;
	
	Найдено = ВыбранныеПолномочияТаблица.НайтиСтроки(
				Новый Структура("ИдентификаторПолномочия",ИдентификаторПолномочия));
	Если Найдено.Количество() > 0 Тогда
		Найдено[0].ЕстьОграничения = ОграниченияПолномочий.НайтиСтроки(
				Новый Структура("ИдентификаторПолномочия",ИдентификаторПолномочия)).Количество() > 0;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьНастройкуПолномочийПослеВыбора(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ЗагрузитьНастройку(Результат);
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНастройку(Настройка)
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	НастройкиПолномочийМЧД.Настройка КАК Настройка
	|ИЗ
	|	РегистрСведений.НастройкиПолномочийМЧД КАК НастройкиПолномочийМЧД
	|ГДЕ
	|	НастройкиПолномочийМЧД.Наименование = &Наименование
	|	И НастройкиПолномочийМЧД.Пользователь = &Пользователь";
	
	Запрос.УстановитьПараметр("Пользователь", Настройка.Пользователь);
	Запрос.УстановитьПараметр("Наименование", Настройка.Наименование);
	Результат = Запрос.Выполнить().Выбрать();
	Если Результат.Следующий() Тогда
		Настройка = Результат.Настройка.Получить();
		ВыбранныеПолномочияТаблица.Очистить();
		ОграниченияПолномочий.Очистить();
		
		ДеревоЗначений = РеквизитФормыВЗначение("Полномочия");
		Найдено = ДеревоЗначений.Строки.НайтиСтроки(
			Новый Структура("Пометка", 1), Истина);
		Для Каждого Строка Из Найдено Цикл
			Строка.Пометка = 0;
		КонецЦикла;
		
		Найдено = ДеревоЗначений.Строки.НайтиСтроки(
			Новый Структура("Пометка", 2), Истина);
		Для Каждого Строка Из Найдено Цикл
			Строка.Пометка = 0;
		КонецЦикла;

		ЗагрузитьВыбранныеПолномочия(Настройка, ДеревоЗначений);
		ДеревоЗначений.Строки.Сортировать("Наименование, Код", Ложь);
		ЗначениеВРеквизитФормы(ДеревоЗначений, "Полномочия");
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройку(НастройкаПолномочий, Наименование)
	
	УстановитьПривилегированныйРежим(Истина);
	Пользователь = Пользователи.ТекущийПользователь();
	
	НаборЗаписей = РегистрыСведений.НастройкиПолномочийМЧД.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Наименование.Установить(Наименование);
	НаборЗаписей.Отбор.Пользователь.Установить(Пользователь);
	НоваяЗапись = НаборЗаписей.Добавить();
	НоваяЗапись.Пользователь = Пользователь;
	НоваяЗапись.Наименование = Наименование;
	НоваяЗапись.Настройка = Новый ХранилищеЗначения(НастройкаПолномочий);
	НаборЗаписей.Записать();

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораОграничений(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(Элементы.ОграниченияПолномочий.ТекущиеДанные, Результат);
	Элементы.ОграниченияПолномочий.ТекущиеДанные.НетВКлассификаторе = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ОграниченияПолномочияКодЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ОткрытьФорму("Справочник.МашиночитаемыеДоверенности.Форма.ВыборЗначенияОграничения",
		Новый Структура("КодОграничения", Элементы.ОграниченияПолномочий.ТекущиеДанные.Код),ЭтотОбъект,,,,
		Новый ОписаниеОповещения("ПослеВыбораЗначенияОграничения", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры
	
&НаКлиенте
Процедура ПослеВыбораЗначенияОграничения(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.ОграниченияПолномочий.ТекущиеДанные.КодЗначения = Результат.Код;
	Элементы.ОграниченияПолномочий.ТекущиеДанные.НетВКлассификатореКодаЗначения = Ложь;
	Элементы.ОграниченияПолномочий.ТекущиеДанные.НаименованиеЗначения = Результат.Наименование;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(
		Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОграниченияПолномочий.ЭтоТекстовоеЗначение");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	
	ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ОграниченияПолномочияКодЗначения");
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбновитьКлассификаторыПолномочийНаСервере()
	
	РегистрыСведений.КлассификаторыМЧД.ОбновитьКлассификаторы();
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСписокПолномочий()
	
	КодыПолномочий = Новый Массив;
	
	Для Каждого Полномочие Из ВыбранныеПолномочияТаблица Цикл
		Если ЗначениеЗаполнено(Полномочие.Код) И Не Полномочие.НетВКлассификаторе Тогда
			КодыПолномочий.Добавить(Полномочие.Код);
		КонецЕсли;
	КонецЦикла;
	
	СформироватьДеревоПолномочий(ПоместитьВоВременноеХранилище(КодыПолномочий));
	
КонецПроцедуры

#КонецОбласти
